package com.order.www;

/**
 * Creared with IntelliJ IDEA.
 * Description:给定两个单词word1和word2，请计算将word1转换为word2至少需要多少步操作。
 * 你可以对一个单词执行以下3种操作：
 * a）在单词中插入一个字符
 * b）删除单词中的一个字符
 * c）替换单词中的一个字符
 * User:yxd
 * Date:2022-03-23
 * Time:22:31
 */
public class Dp9 {
    public int minDistance (String word1, String word2) {
        // write code here
        //状态定义F(i,j) 从w1转换为w2需要的操作
        //状态转移方程从增，删，替换看哪个操作需要的操作最少取其最小值
        //F(i,j) = Math.min(F(i - 1,j) + 1,F(i,j - 1) + 1,F(i - 1,j - 1) + 看是否两个字符串相不相等 相等不加不相等替换需要加1)
        //初始定义第一行所有都为j 第一列都为i
        if(word1 == null || word2 == null){
            return -1;
        }
        int n = word1.length();
        int m = word2.length();
        int[][] dp = new int[n + 1][m + 1];
        for(int i = 0;i <= n;i ++){
            dp[i][0] = i;
        }
        for(int i = 0;i <= m;i ++){
            dp[0][i] = i;
        }
        for(int i = 1;i <= n;i ++){
            for(int j = 1;j <= m;j ++){
                dp[i][j] = Math.min(dp[i -1][j] + 1,dp[i][j - 1] + 1);
                if(word1.charAt(i - 1) == word2.charAt(j - 1)){
                    dp[i][j] = Math.min(dp[i - 1][j - 1],dp[i][j]);
                }else{
                    dp[i][j] = Math.min(dp[i - 1][j - 1] + 1,dp[i][j]);
                }
            }
        }
        return dp[n][m];
    }
}
